/**
 * 
 */
package com.cosmetics.groupware.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;

import javax.servlet.http.HttpServletResponse;

/**
 * description :
 * @author     : dreams
 * @Date       : 2011. 7. 23.
 * @Version    :   
 * <pre>
 * com.cosmetics.groupware.util |_ FileManager.java
 * </pre>
 */
public class FileManager {
	
	/**
	 * description  : 파일 업로드
	 * @Method Name : doFileUpload
	 * @param file : 클라이언트가 업로드한 파일
	 * @param originalFileName : 클라이언트가 업로드한 파일명
	 * @param path : 서버에 저장된 경로
	 * @return newFileName : 서버에 저장된 새로운 파일명
	 * @throws Exception
	 */
	public static String doFileUpload(File file, String originalFileName, String path) throws Exception {
		String newFileName = null;
		// 파일 미지정시
		if (file == null) {
			return null;
		}
		// 클라이언트가 업로드한 파일의 이름이 없는 경우
		if ("".equals(originalFileName)) {
			return null;
		}
		// 확장자 체크
		String fileExt = originalFileName.substring(originalFileName.lastIndexOf("."));
		if (fileExt == null || "".equals(fileExt)) {
			return null;
		}
		// 서버에 저장할 새로운 파일명을 생성
		newFileName = String.format("%1$tY%1$tm$td%1$td%1$tH%1$tM%1$tS", Calendar.getInstance());
		newFileName += System.nanoTime();
		newFileName += fileExt;
		File dir = new File(path);
		if (!dir.exists()) {
			dir.mkdirs();
		}
		String fullFileName = path + File.separator + newFileName;
		
		// 파일복사
		FileInputStream fis = new FileInputStream(file);
		FileOutputStream fos = new FileOutputStream(fullFileName);
		int bytesRead = 0;
		byte[] buffer = new byte[1024];
		while ((bytesRead = fis.read(buffer, 0, 1024)) != -1) {
			fos.write(buffer, 0, bytesRead);
		}
		fos.close();
		fis.close();
		
		return newFileName;
	}
	
	/**
	 * description  : 서버파일 다운로드 
	 * @Method Name : doFileDownload
	 * @param savedFileName
	 * @param originalFileName
	 * @param path
	 * @param response
	 * @return
	 */
	public static boolean doFileDownload(String savedFileName, String originalFileName, String path, HttpServletResponse response) {
		String load_dir = path + File.separator + savedFileName;
		
		try {
			if (originalFileName == null || "".equals(originalFileName)) {
				originalFileName = savedFileName;
			}
			originalFileName = new String(originalFileName.getBytes("euc-kr"),"8859_1");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		try {
			File file = new File(load_dir);
			
			if (file.exists()) {
				byte readByte[] = new byte[4096];
				response.setContentType("application/octet-stream");
				response.setHeader("Content-disposition", "attachment;filename="+originalFileName);
				
				BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file));
				OutputStream outs = response.getOutputStream();
				int read;
				while ((read = fin.read(readByte, 0, 4096)) != -1) {
					outs.write(readByte, 0, read);
				}
				try {
					outs.flush();
				} catch (IOException e) {
					e.printStackTrace();
				}
				outs.close();
				fin.close();
				
				return true;
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return false;
	}
	
	
	/**
	 * description  : 파일 삭제 
	 * @Method Name : doFileDelete
	 * @param fileName
	 * @param path
	 * @throws Exception
	 */
	public static void doFileDelete(String fileName, String path) throws Exception {
		File file = null;
		String fullFileName = path + "\\" + fileName;
		file = new java.io.File(fullFileName);
		if (file.exists()) {
			file.delete();
		}
	}
	
} // end of class
